/**
 * GenericDAO.java
 *
 * $Id$
 *
 */
package com.dao;

import com.infra.HibernateUtil;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Dyego Souza do Carmo
 * @since
 */
public abstract class GenericDAO {

    private static final long serialVersionUID = 1L;

    /**
     * Construtor padr�o
     *
     * @author Dyego Souza do Carmo
     * @version 1.0,
     */
    public GenericDAO() {
    }

    protected Session getSession() {
        return HibernateUtil.getSession().openSession();
    }

    protected void saveOrUpdatePojo(Serializable pojo) {
        Session ses = getSession();
        ses.saveOrUpdate(pojo);
        ses.getTransaction().commit();
        ses.close();
    }

    protected <T extends Serializable> T getPojo(Class<T> classToSearch, Serializable key) {
        Session ses = getSession();
        Serializable toReturn = (Serializable) ses.get(classToSearch, key);
        ses.getTransaction().commit();
        ses.close();
        return (T) toReturn;
    }

    protected void removePojo(Serializable pojoToRemote) {
        Session ses = getSession();
        ses.delete(pojoToRemote);
        ses.getTransaction().commit();
        ses.close();
    }

    protected Serializable getPurePojo(String query, Object... params) {
        Session ses = getSession();

        Query qr = ses.createQuery(query);
        for (int i = 1; i <= params.length; i++) {
            qr.setParameter(i, params[i - 1]);
        }
        Object toReturn = qr.uniqueResult();

        ses.getTransaction().commit();
        ses.close();
        return (Serializable) toReturn;
    }

    protected <T extends Serializable> List<T> getPureList(Class<T> classToCast, String query, Object... params) {
        Session ses = getSession();

        Query qr = ses.createQuery(query);
        for (int i = 1; i <= params.length; i++) {
            qr.setParameter(i, params[i - 1]);
        }
        @SuppressWarnings("unchecked")
        List<T> toReturn = qr.list();

        if (ses.getTransaction().isActive()) {
            ses.getTransaction().commit();
        }
        ses.close();
        return toReturn;
    }
}
